/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ctrl.sys;

import java.io.EOFException;
import java.io.ObjectInputStream;
import java.net.Socket;
import ctrl.jeu.Table;

/**
 * Classe permettant à un client de recevoir une reponse envoyer par le serveur sous forme de Thread
 * @author willy
 */
public class ClientReceive extends Thread{

    private Socket client; // le client tcp
    private Table tb;
    MomentUser mt;
    public ClientReceive(Socket client, Table t){
        this.client=client;
        this.tb=t;
    }

    /**
     * Methode run qui permet de démarrer le procesus de lecture des paquets
     */
    public void run(){
        // données locales
        ObjectInputStream IN=null; // flux lecture réseau
        Object reponse=null; // reponse serveur
        try{
            IN=new ObjectInputStream(client.getInputStream()); // création du flux lecture réseau
            // boucle lecture lignes de texte du flux IN
            System.out.println("reception");
            int k=0;
            while(true){
                try {
                    reponse=(Reponse)IN.readObject();
                }catch(EOFException eofex)
                {
                    continue; // aucun flux lisible
                }

                System.out.println("[reponse]--> N°="+k+" "+reponse);
                // arret des thread précédents
                if(mt!=null) if(mt.isAlive()) { mt.destroy(); }
                
                //traitement de la reponse
                Reponse rsp=(Reponse)reponse;
                tb.setPlaces(rsp.getPlaces());
                tb.setMises(rsp.getMises());
                tb.setFlop(rsp.getFlop());
                tb.setTournant(rsp.getTournant());
                tb.setRiviere(rsp.getRiviere());
                tb.setFinTour(rsp.isFinTour());
                
                for(int i=0;i<tb.getChaises().size();i++)
                {
                    tb.getChaises().get(i).CreeAction(tb.getPlaces());
                }
                if(tb.getPlaceMain()==null)
                    if(!((Reponse)reponse).getObs())
                    {
                        tb.setPlaceMain(((Reponse)reponse).getPlaces().get(((Reponse)reponse).getPlaces().size()-1));
                        tb.getPlaceMain().setPlayer(tb.Play);
                        //System.out.println("tb.Play -- "+tb.Play);
                    }
                // si le serveur envoi une info pour effectuer le parcours de la table.
                if(((Reponse)reponse).isParcours())
                {
                    mt=new MomentUser(tb,((Reponse)reponse).getActif());
                    mt.start();
                }
                // ecrit l'action dans la zone de texte
                if(((Reponse)reponse).getTexte()!=null)
                {
                    String val=tb.getTexteAction().getText().getText().substring(tb.getTexteAction().getText().getText().indexOf("<body>")+6,tb.getTexteAction().getText().getText().lastIndexOf("</body>"));
                    tb.getTexteAction().getText().setText("<html>"+val+((Reponse)reponse).getTexte()+"<br /></html>");
                }
                tb.Fenetre.repaint();
                k++;
            }
        }catch(Exception ex){
            System.err.println("Réception : L'erreur suivante s'est produite : " + ex.getMessage());
            ex.printStackTrace();
        }
        try{
            IN.close();//client.close();
        }catch(Exception ex){}
        System.out.println("[Réception : fin du thread de lecture des reponses du serveur]");
    }
}
